<?php
/*
ACE使用标准的curl
SAE目前已经完全兼容cURL模块，推荐用户使用cURL*函数
百度云平台的Fetchurl服务完全兼容cUrl
因此此版本模块实际没有内容（将来可能做一个很好的包装类，但也超出了本项目的功能定义）

http://cn.php.net/manual/zh/book.curl.php
curl_close — 关闭一个cURL会话
curl_copy_handle — 复制一个cURL句柄和它的所有选项
curl_errno — 返回最后一次的错误号
curl_error — 返回一个保护当前会话最近一次错误的字符串
curl_exec — 执行一个cURL会话
curl_getinfo — 获取一个cURL连接资源句柄的信息
curl_init — 初始化一个cURL会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄
curl_multi_close — 关闭一组cURL句柄
curl_multi_exec — 解析一个cURL批处理句柄
curl_multi_getcontent — 如果设置了CURLOPT_RETURNTRANSFER，则返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的cURL的相关传输信息
curl_multi_init — 返回一个新cURL批处理句柄
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — 等待所有cURL批处理中的活动连接
curl_setopt_array — 为cURL传输会话批量设置选项
curl_setopt — 设置一个cURL传输选项
curl_version — 获取cURL版本信息


http://sae.sina.com.cn/?m=devcenter&catId=197
文档中心 » 平台介绍 » 服务列表 » FetchURL
 服务概要
 应用场景
 使用指南
　　 抓取页面
　　 发起POST请求
　　 错误码参考
 服务限制与配额
　　 服务限制
　　 分钟配额
 常见问题
收起
服务概要
    特别说明：SAE目前已经完全兼容cURL模块（内部用FetchURL实现），所以用户可以使用cURL*函数进行HTTP请求，兼容用户以往的使用习惯，使用户的学习成本降为零。所以我们推荐用户使用cURL*函数，以下关于FetchURL的文档仅供老用户参考。
    FetchURL是SAE为开发者提供的分布式网页抓取服务，用来同步的抓取http页面，FetchURL针对国内的网络的做了优化，内部有调度系统，尽可能保证用户快速的抓取到目标页面。在SAE上使用FetchURL非常简单，只需要调用sae_std_lib中的几个简单的函数即可。但需要特别注意的是，为了平台安全性，SAE对FetchURL做了一些限制：
http连接超时<=5秒
send超时<=15秒
read超时<=20秒
http header禁用项：Content-Length、Host、Vary、Via、X-Forwarded-For、FetchUrl、AccessKey、TimeStamp、Signature、AllowTruncated、ConnectTimeout、SendTimeout、ReadTimeout
    另外，SAE规定FetchURL的user-agent默认包含SAE/fetchurl-accesskey，其中accesskey是用户的accesskey，用户可以自行添加user-agent。Referer用户也可以自行定义。
应用场景
    FetchURL适用的场景主要有：
    1. 抓取http资源
    2. 发送http rest请求
    3. FetchURL支持https，并且支持重定向
使用指南
 抓取页面
    $f = new SaeFetchurl();
    $content = $f->fetch('http://sina.cn');
 发起POST请求
    $f = new SaeFetchurl();
    $f->setMethod('post');
    $f->setPostData( array('name'=> 'easychen' , 'email' => 'easychen@gmail.com' , 'file' => '文件的二进制内容') );
    $ret = $f->fetch('http://photo.sinaapp.com/save.php');
    //抓取失败时输出错误码和错误信息
    if ($ret === false)
        var_dump($f->errno(), $f->errmsg());
 错误码参考
    errno: 0 成功
    errno: 600 fetchurl 服务内部错误
    errno: 601 accesskey 不存在
    errno: 602 认证错误，可能是secretkey错误
    errno: 603 超出fetchurl的使用配额
    errno: 604 REST 协议错误，相关的header不存在或其它错误，建议使用SAE提供的fetch_url函数
    errno: 605 请求的URI格式不合法
    errno: 606 请求的URI，服务器不可达
服务限制与配额
    SAE设置服务限制和配额的目的是为了防止个别用户攻击和滥用，从而在公有云计算平台上保证绝大多数开发者的正常使用。
    1. 服务限制和配额设定是在门户网站新浪自身长期运维的基础上经过严格计算得出的，所以正常使用一般不会出现问题。经过SAE实际统计，99%的应用不会受到任何影响
    2. 当您发现您的某项服务超过限制或者超配时，请先阅读相关文档确认限制和配额的具体数值，再检查自己的程序是否存在使用不当的情况，如果仍然解决不了，可以和SAE官方联系，saeadmin@sina.cn
服务限制
connect_timeout	5秒
send_timeout	15秒
read_timeout	20秒
抓取文件大小	8MB
禁用头，这些头用户无法修改	Content- Length、Host、Vary、Via、X-Forwarded-For、FetchUrl、AccessKey、TimeStamp、 Signature、AllowTruncated、ConnectTimeout、SendTimeout、ReadTimeout
分钟配额
    运行在SAE上的应用(App)将会消耗平台资源，为保证各App不互相影响，我们引入了
	*分钟配额*的概念，即：在每分钟内每个应用的各个服务所消耗 的 资源的速度。比如，当平台中的某个应用的MySQLl服务一分钟内累计请求数达到10万，或者流出宽带超过200M，我们将会立即禁掉该应用的MySQL 服务，禁用五分钟后，会自动恢复，避免影响到SAE平台的稳定性。服务因为超过“分钟配额”而被禁用时，会在“服务状态”看到该服务被禁用的原因是：OverMinuteQuota
服务	请求数	cpu时间	流入带宽	流出带宽
Fetchurl	100,000	NA	200MB	200MB
 常见问题
    SAE平台出口IP：
    220.181.129.126
    220.181.129.121
    220.181.136.229
    220.181.136.230
    http接口方需要IP授权可以进行相应的设置。

http://dev.baidu.com/wiki/bae/index.php?title=Fetch_Url
Fetch Url
目录[隐藏]
1 服务简介
2 使用示例
3 函数介绍
3.1 get
3.2 getCurlInfo
3.3 getHttpCode
3.4 getResponseBody
3.5 getResponseBodyLen
3.6 getResponseHeader
3.7 getResponseHeaderString
3.8 post
3.9 reset
3.10 setCookie
3.11 setCookies
3.12 setHeader
3.13 setOpt
3.14 setOptionFollowLocation
3.15 setOptionMaxRedirs
3.16 errmsg
3.17 errno
服务简介


    FetchURL是云平台为开发者提供的网页抓取服务，支持http&https，用户可根据需求修改请求头部信息、携带cookie访问目标页面。 
    云平台的Fetchurl服务完全兼容cUrl，参见client url library标准手册：http://cn.php.net/manual/zh/book.curl.php
    另外fetchurl提供了SDK封装供开发者选择（SDK只为兼容百度应用开放平台用户，建议直接使用cUrl）
使用示例

开发者可以通过下面的示例，初步了解fetchurl的使用方法

<?php
//代码示例， 利用fetchurl sdk 抓取目标网页内容、向目标地址post数据

require_once "BaeFetchUrl.class.php";
//创建sdk对象
$fetch= new BaeFetchUrl();
//设置自定义头部
$fetch->setHeader('Expect', '');
//设置最大重定向次数
$fetch->setOptionMaxRedirs(2);
$fetch->setOptionFollowLocation(true);
//设置cookie
$fetch->setCookie('timestamp', time());
//发起一次get请求
$fetch->get("http://www.baidu.com");
//获取http code
$content= $fetch->getHttpCode();
var_dump($content);
//获取curl句柄信息
$content=$fetch->getCurlInfo();
var_dump($content);
//获取返回的头部信息
$content= $fetch->getResponseHeader();
var_dump($content);
//获取返回的包体长度
$content= $fetch->getResponseBodyLen();
var_dump($content);
//获取返回的包体数据
$content= $fetch->getResponseBody();
//var_dump($content);
//重置curl句柄
$fetch->reset();
//构造post请求
$data = array('name'=>'baidu', 'pwd'=> 'bae');
$post = http_build_query($data);
//设置post参数，实际post的内容
$fetch->setOpt('post', $post);
//发起一次post请求
$fetch->post("http://news.baidu.com");
//获取头部信息
$content= $fetch->getResponseHeaderString();
var_dump($content);
?>
开发者可以在本地进行编码，之后通过svn上传到云平台中。如有疑问，可以查看svn使用教程
函数介绍

get
原型：
public function get($url)
功能:发送一个http get请求
参数：
参数名 	 说明
$url	   字符串类型。目标url
调用实例：
1. $fetch= new BaeFetchUrl();
2. $fetch->setHeader('Expect', '');
3. $fetch->setOptionMaxRedirs(2);
4. $fetch->setOptionFollowLocation(true);
5. $fetch->setCookie('timestamp', time());
6. $content= $fetch->get("http://www.baidu.com");
7. echo $content;
返回值： 
返回值 	 说明
字符串类型或布尔类型 
成功返回http包体
失败返回false
返回值示例：
 false
getCurlInfo
原型：
public fuction getCurlInfo() 
功能：获取cUrl 句柄的信息   
调用实例：
1. $fetch= new BaeFetchUrl();
2. $fetch->get("http://www.baidu.com");
3. $content= $fetch->getCurlInfo();
4. var_dump($content);
返回值： 
返回值	 说明
一维数组类型	 参考 curl_getinfo函数返回：
http://cn.php.net/manual/zh/function.curl-getinfo.php

返回值示例：
 array(21) {
  ["url"]=>
  string(20) "http://www.baidu.com"
  ["content_type"]=>
  string(24) "text/html;charset=gb2312"
  ["http_code"]=>
  int(200)
  ["header_size"]=>
  int(411)
  ["request_size"]=>
  int(157)
  ["filetime"]=>
  int(-1)
  ["ssl_verify_result"]=>
  int(0)
  ["redirect_count"]=>
  int(0)
  ["total_time"]=>
  float(0.003557)
  ["namelookup_time"]=>
  float(0.000496)
  ["connect_time"]=>
  float(0.002261)
  ["pretransfer_time"]=>
  float(0.002309)
  ["size_upload"]=>
  float(0)
  ["size_download"]=>
  float(3365)
  ["speed_download"]=>
  float(946021)
  ["speed_upload"]=>
  float(0)
  ["download_content_length"]=>
  float(3365)
  ["upload_content_length"]=>
  float(0)
  ["starttransfer_time"]=>
  float(0.003416)
  ["redirect_time"]=>
  float(0)
  ["request_header"]=>
  string(157) "GET / HTTP/1.1
User-Agent: BaeFetchUrl v1.0
Host: www.baidu.com
Accept: * / *
Accept-Encoding: deflate, gzip
Referer: 
Cookie: timestamp=1330673132; 
"
}
getHttpCode
原型：
public function getHttpCode()  
功能：获取响应包的http status code    
调用实例:
$fetch= new BaeFetchUrl();
2. $fetch->get("http://www.baidu.com");
3. $content= $fetch->getHttpCode();
4. echo $content;
返回值： 
返回值	 说明
整数类型	 http返回值
返回值示例：
 200
getResponseBody
原型：
public function  getResponseBody() 
功能：获取响应的http 包体内容
调用实例：
1. $fetch= new BaeFetchUrl();
2. $fetch->get("http://www.baidu.com");
3. $content= $fetch->getResponseBody();
4. echo $content;
返回值： 
返回值 	 说明
字符串类型	 http返回包包体


getResponseBodyLen
原型：
public function getResponseBodyLen() 
功能：获取响应的http 包体长度
调用实例：
1. $fetch= new BaeFetchUrl();
2. $fetch->get("http://www.baidu.com");
3. $content= $fetch->getResponseBodyLen();
4. echo $content;
返回值： 
返回值	 说明
整数类型	 http返回包包体长度
返回值示例：
 3365
getResponseHeader
原型：
public function getResponseHeader()  
功能：获取响应的http 头部信息    
调用实例：
1. $fetch= new BaeFetchUrl();
2. $data = array('name'=>'baidu', 'pwd'=> 'bae');
3. $post = http_build_query($data);
4. $fetch->setOpt('post', $post);
5. $fetch->post("http://www.baidu.com");
6. $content= $fetch->getResponseHeader();
7. var_dump($content);
返回值： 
返回值 	 说明
一维数组类型
http返回包头部信息
返回值示例：
 array(10) {
  ["Date"]=>
  string(29) "Fri, 02 Mar 2012 07:43:12 GMT"
  ["Server"]=>
  string(6) "Apache"
  ["P3P"]=>
  string(34) "CP=" OTI DSP COR IVA OUR IND COM ""
  ["Set-Cookie"]=>
  array(1) {
    [0]=>
    string(140) "BAIDUID=432F2A648EFCADF788053BF83FB84213:FG=1; expires=Wed, 20-Mar-80 10:57:19 GMT; max-age=2147483647; path=/; domain=.baidu.com; version=1"
  }
  ["Vary"]=>
  string(15) "Accept-Encoding"
  ["Content-Encoding"]=>
  string(4) "gzip"
  ["Cache-Control"]=>
  string(8) "no-cache"
  ["Connection"]=>
  string(10) "Keep-Alive"
  ["Transfer-Encoding"]=>
  string(7) "chunked"
  ["Content-Type"]=>
  string(9) "text/html"
}
getResponseHeaderString
原型：
public function getResponseHeaderString() 
功能：获取响应的http 头部信息    
调用实例：
1. $fetch= new BaeFetchUrl();
2. $data = array('name'=>'baidu', 'pwd'=> 'bae');
3. $post = http_build_query($data);
4. $fetch->setOpt('post', $post);
5. $fetch->post("http://www.baidu.com");
6. $content= $fetch->getResponseHeader();
7. echo $content;
返回值： 
返回值 	 说明
字符串类型	 http返回包头部信息
返回值示例：
 "HTTP/1.1 200 OK
Date: Fri, 02 Mar 2012 07:44:53 GMT
Server: Apache
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Set-Cookie: BAIDUID=2048F91E6B7EE8884D7B52D12D55DBBE:FG=1; expires=Wed, 20-Mar-80 10:59:00 GMT; max-age=2147483647; path=/; domain=.baidu.com; version=1
Vary: Accept-Encoding
Content-Encoding: gzip
Cache-Control: no-cache
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html
"
post
原型：

public function post($url) 
功能：发送一个http post请求   
参数： 
参数名	 说明
$url	 字符串类型。目标地址
调用实例:
1. $fetch= new BaeFetchUrl();
2. $fetch->setHeader('Expect', '');
3. $fetch->setHeader('Content-Type', 'multipart/form-data');
4. $data = array('name'=>'baidu', 'pwd'=> 'bae');
5. $post = http_build_query($data);
6. $fetch->setOpt('post', $post);
7. $fetch->setCookie('timestamp', time());
8. $content= $fetch->post("http://www.baidu.com");
9. echo $content;
返回值：  
返回值 	 说明
字符串类型或布尔类型	
成功返回http包体
失败返回false
返回值示例：
 false
reset
原型：
public function reset()
功能：重置cUrl句柄   
调用实例：
1. $fetch= new BaeFetchUrl();
2. $content= $fetch->get("http://www.baidu.com");
3. $fetch->reset();

setCookie
原型：
public function setCookie($name,$value) 
功能：设置cookies，以key,value方式传递  
参数： 
参数名	 说明
$name	   字符串类型。cookie 键
$value	   字符串类型。cookie 值
调用实例：
1. $fetch= new BaeFetchUrl();
2. $fetch->setCookie('timestamp', time());
setCookies
原型：
public function setCookies($cookies = array())  
功能：设置cookies，以key,value方式传递
参数：
参数名	 说明
$cookies	   一维数组类型。cookie键值对数组
调用实例：
1. $fetch= new BaeFetchUrl();
2. $fetch->setCookies(array('time'=>time(), 'test'=> 'test'));
setHeader
原型：
public function setHeader($name, $value)  
功能： 设置头部信息 
参数： 
参数名	 说明
$name	   字符串类型。header键(content-length、host、vary、via、x-forwarded-for禁止设置)
$value	   字符串类型。header值
调用实例：
1. $fetch= new BaeFetchUrl();
2. $fetch->setHeader('Expect', '');
返回值： 
返回值 	 说明
布尔类型 
成功返回true，失败返回false
setOpt
原型：
public function setOpt($name, $value)   
功能：为cUrl句柄设置参数。
        支持的键值包括post （对应CURLOPT_POSTFIELDS）、port （对应CURLOPT_PORT）、username（对应CURLOPT_USERPWD）、password（对应CURLOPT_USERPWD）、useragent（对应CURLOPT_USERAGENT）

参数： 
参数名	 说明
$name	   字符串类型。选项参数键
$value	   字符串类型。选项参数值
调用实例：
1. $fetch= new BaeFetchUrl();
2. $data = array('name'=>'baidu', 'pwd'=> 'bae');
3. $post = http_build_query($data);
4. $fetch->setOpt('post', $post);
setOptionFollowLocation
原型：
public function setOptionFollowLocation ($flag)
功能：为True 时会将服务器返回的"Location: "放在header中递归返回(CURLOPT_FOLLOWLOCATION) 
        使用setOptionMaxRedirs函数(CURLOPT_MAXREDIRS)可以限定递归返回的数量

参数： 
参数名	 说明
$flag	   布尔类型。是否开启选项
调用实例：
1. $fetch= new BaeFetchUrl();
2. $fetch->setOptionMaxRedirs(3);
3. $fetch->setOptionFollowLocation(true);
setOptionMaxRedirs
原型：
public function setOptionMaxRedirs($count)     
功能： 设置HTTP 重定向最大次数(CURLOPT_MAXREDIRS)
         需配合setOptionFollowLocation函数（CURLOPT_FOLLOWLOCATION）一起使用

参数： 
参数名	 说明
$count	   整数类型。最大重定向次数
调用实例：
1. $fetch= new BaeFetchUrl();
2. $fetch->setOptionMaxRedirs(3);
3. $fetch->setOptionFollowLocation(true);
errmsg
原型：
public function errmsg()
功能:查看请求错误信息（请求出错时调用）
调用实例：
1. $fetch= new BaeFetchUrl();
2. $content= $fetch->get("http://www.baidu.com");
3. if(!$content){
4.   var_dump($fetch->errmsg());
5. }


返回值： 
返回值 	 说明
字符串
请求错误信息
返回值示例：
 "Request for www.baidu.com, check quota failed"
errno
原型：
public function errno()
功能:查看请求错误码（出错时调用）
调用实例：
1. $fetch= new BaeFetchUrl();
2. $content= $fetch->get("http://www.baidu.com");
3. if(!$content){
4.   var_dump($fetch->errno());
5. }
返回值： 
返回值 	 说明
整型
错误码
返回值示例：
 30500


*/
?>